package com.kg.tombs.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class PinyinUtils {

    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();

    static {
        // 小写
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        // 无声调
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
    }

    /**
     * 将中文字符串转为全拼（字母+数字混合，非中文字符保留）
     * 例如："辽墓服饰" → "liaomufushi"
     */
    public static String toPinyin(String chinese) {
        if (chinese == null || chinese.isEmpty()) {
            return "";
        }

        StringBuilder pinyin = new StringBuilder();
        for (char c : chinese.toCharArray()) {
            if (Character.isWhitespace(c)) {
                pinyin.append('_'); // 空格转为下划线
                continue;
            }

            // 判断是否为中文字符（基本汉字范围）
            if (c >= 0x4E00 && c <= 0x9FA5) {
                try {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        pinyin.append(pinyinArray[0]); // 取第一个读音
                    } else {
                        pinyin.append('_'); // 无法识别的字符转为下划线
                    }
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    pinyin.append('_');
                }
            } else if (Character.isLetterOrDigit(c)) {
                pinyin.append(c); // 保留字母和数字
            } else {
                pinyin.append('_'); // 其他符号（如标点）转为下划线
            }
        }

        return pinyin.toString();
    }

    /**
     * 转为合法的 Neo4j 数据库名（字母开头，仅含字母/数字/下划线）
     */
    public static String toValidDatabaseName(String input) {
        String pinyin = toPinyin(input);
        // 确保以字母开头
        if (pinyin.isEmpty()) {
            return "db_default";
        }
        if (!Character.isLetter(pinyin.charAt(0))) {
            pinyin = "db_" + pinyin;
        }
        // 移除连续下划线，限制长度
        pinyin = pinyin.replaceAll("_+", "_").replaceAll("_$", "");
        if (pinyin.length() > 60) {
            pinyin = pinyin.substring(0, 60);
        }
        return pinyin;
    }

}
